En mi aplicación UWSGI Flask recibo errores intermitentes como los siguientes:
DatabaseError: (psycopg2.DatabaseError) error with no message from the libpqResourceClosedError: This result object does not return rows. It has been closed automatically.NoSuchColumnError: "Could not locate column in row for column 'my_table.my_column_name_that_exists'"DatabaseError: (psycopg2.DatabaseError) insufficient data in "D" message...lost synchronization with server: got message type "2", length 740303471 En mi registro de postgresql veo: WARNING: there is already a transaction in progress
Actualizar la página web en el matraz generalmente resuelve el error.
Estos son los pasos que tomo para reproducir el error:
sudo service postgresql restart Intenté aumentar la verbosidad del registro de postgresql y lo que parece ser un intercambio inadecuado de transacciones virtuales, por ejemplo, a continuación se muestran todas las entradas de registro con la transacción virtual 2/53 y corresponde a los errores anteriores:
process 8548 session 5901589a.2164 vtransaction 2/53 LOG: statement: BEGIN process 8548 session 5901589a.2164 vtransaction 2/53 LOG: statement: SELECT 1 process 8548 session 5901589a.2164 vtransaction 2/53 LOG: statement: SELECT my_table.id AS my_table_id, ... FROM my_table WHERE my_table.id = 'my_id' LIMIT 1 process 8548 session 5901589a.2164 vtransaction 2/53 LOG: statement: BEGIN process 8548 session 5901589a.2164 vtransaction 2/53 WARNING: there is already a transaction in progress process 8548 session 5901589a.2164 vtransaction 2/53 LOG: statement: SELECT 1 process 8548 session 5901589a.2164 vtransaction 2/53 LOG: statement: SELECT my_other_table.id AS my_other_table_id, ... FROM my_other_table WHERE 'my_other_id' = my_other_table.id process 8548 session 5901589a.2164 vtransaction 2/53 LOG: statement: SELECT my_table.id AS my_table_id, ... FROM my_table WHERE my_table.id = 'my_id' LIMIT 1 process 8548 session 5901589a.2164 vtransaction 2/53 LOG: statement: ROLLBACKEstos errores son síntomas de conexiones de bases de datos compartidas incorrectamente por varios subprocesos o procesos.
De forma predeterminada, uwsgi bifurca el proceso después de crear la aplicación en el archivo wsgi. Si la creación de la aplicación crea conexiones de base de datos que pueden reutilizarse, es probable que termine con procesos bifurcados que tienen un estado de base de datos corrupto. Para resolver esto en uwsgi hay opciones:
--lazy-apps , que cambia uwsgi a bifurcación antes de que se cree la aplicación Hay consecuencias de rendimiento negativas para el modo lazy-apps (ver prebifurcación vs aplicaciones perezosas vs perezosas ), por lo que evitar el uso de la base de datos durante la creación de la aplicación es generalmente la mejor opción.
Gracias univerio por explicar esto en los comentarios.